from flask import *
from exts import *
from models import *

home2 = Blueprint('home2',__name__,url_prefix='/home2')
@home2.route('/')
def home2_index():
    return "home2"
# 文章列表sel
@home2.route('/getArticle')
def getArticle():
    try:
        
        # 获取有sel值的文章并按sel升序排序
        ordered_list = articles.query.filter(articles.sel > 0, articles.sel < 5).order_by(articles.sel.asc()).all()
            
        # 如果获取的文章少于4个，用id升序补充
        if len(ordered_list) < 4:
            remaining = 4 - len(ordered_list)
            # 排除已经获取的文章ID
            excluded_ids = [article.id for article in ordered_list]
            additional = articles.query.filter(
                ~articles.id.in_(excluded_ids)
            ).order_by(articles.id.asc()).limit(remaining).all()
            New_list = ordered_list + additional
        else:
            # 如果没有sel参数，按view_date降序排序
            New_list = articles.query.order_by(articles.view_date.desc()).limit(4).all()

        if New_list == []:
            return jsonify({
                "code": 500,
                "message": f"Article1获取数据为空",
                "data": None
            })
        else:
            json_list = []
            for i in range(len(New_list)):
                josn = {
                    'id': New_list[i].id,
                    'title': New_list[i].title,
                    'content': getFirstText(contentUcode(New_list[i].contents_json)),
                    'img': getFirstImg(contentUcode(New_list[i].contents_json)),
                    'column': New_list[i].column,
                    'view_date': New_list[i].view_date
                }
                json_list.append(josn)
            json = {
                "code": 200,
                "message": "获取列表数据成功",
                "data": json_list
            }
            return jsonify(json)
    except Exception as e:
        print('错误', e)
        return jsonify({
            "code": 500,
            "message": f"获取列表数据失败: {str(e)}",
            "data": None
        })
    

# 轮播图 sel
@home2.route("/hotCarousel")
def hotCarousel():
    try:
        # 获取有sel值的文章并按sel升序排序
        ordered_list = articles.query.filter(articles.sel > 4, articles.sel < 10).order_by(articles.sel.asc()).all()
            
        # 如果获取的文章少于5个，用随机排序补充
        if len(ordered_list) < 5:
            remaining = 5 - len(ordered_list)
            # 排除已经获取的文章ID
            excluded_ids = [article.id for article in ordered_list]
            additional = articles.query.filter(
                ~articles.id.in_(excluded_ids)
            ).order_by(func.rand()).limit(remaining).all()
            Carousel_list = ordered_list + additional
        else:
            # 如果sel的文章超过5个，只取前5个
            Carousel_list = ordered_list[:5]

        if Carousel_list == []:
            return jsonify({
                "code": 500,
                "message": f"轮播图区域获取数据错误",
                "data": None
            })
        else:
            json_list = []
            for i in range(len(Carousel_list)):
                josn = {
                    'id': Carousel_list[i].id,
                    'title': Carousel_list[i].title,
                    'img': getFirstImg(contentUcode(Carousel_list[i].contents_json)),
                    'column': Carousel_list[i].column
                }
                json_list.append(josn)
            json = {
                "code": 200,
                "message": "获取列表数据成功",
                "data": json_list
            }
            return jsonify(json)
    except Exception as e:
        print('错误', e)
        return jsonify({
            "code": 500,
            "message": f"获取列表数据失败: {str(e)}",
            "data": None
        })



# 定义了两个路由装饰器来处理 /AnimeList/ 路径的GET请求
# 第一个装饰器 @home.route('/AnimeList/', defaults={'Ac': None}, methods=['GET'])
# 用于处理当访问 /AnimeList/ 路径时，没有提供Ac参数的情况，此时默认将Ac参数设为None
@home2.route('/AnimeList/', defaults={'Ac': None}, methods=['GET'])  
# 第二个装饰器 @home.route('/AnimeList/<Ac>', methods=['GET'])
# 用于处理当访问 /AnimeList/ 路径并提供了Ac参数的情况，<Ac> 表示这是一个动态参数
@home2.route('/AnimeList/<Ac>', methods=['GET'])  
def AnimeList(Ac):
    # 定义名为AnimeList的函数，接收一个参数Ac，根据不同情况获取不同的动物列表数据并返回相应的JSON结果

    try:
        Animeclass = Ac
        # print(Animeclass)

        # 判断Ac参数是否为None
        if Animeclass == None:
            # 如果Ac为None，调用animal模块的get_all_animal方法获取所有动物的列表
            animal_list = animal.get_all_animal()
        else:
            # 如果Ac不为None，调用animal模块的get_animal_by_class方法，根据传入的Ac参数（动物分类）获取相应分类的动物列表
            animal_list = animal.get_animal_by_class(Animeclass)

        # print('123', animal_list) 

        json_list = []
        # 如果获取到的动物列表为空
        if animal_list == []:
            return jsonify({
                "code": 500,
                "message": f"{Animeclass}的分类数据为空",
                "data": None
            })

        # 遍历获取到的动物列表
        for i in range(len(animal_list)):
            josn = {
                'id': animal_list[i].id,
                '全名': animal_list[i].全名,
                '分类': animal_list[i].分类,
                'imgPath': animal_list[i].imgPath,
            }
            json_list.append(josn)

        return jsonify({
            "code": 200,
            "message": "获取列表数据成功",
            "data": json_list
        })
    except Exception as e:
        return jsonify({
            "code": 500,
            "message": f"获取列表数据失败: {str(e)}",
            "data": None
        })
    












# 函数区
#  将json的unicode转码

def getFirstImg(data):
    # 遍历每一个元素
    for item in data:
        # 如果类型是 "img"，返回对应的 URL
        if item.get('type') == 'img':
            return item.get('url')
    # 如果没有找到图片类型，则返回 None 或其他标识
    return None




def contentUcode(contents_json):

    # contents_json = contents_json.replace(r"\\u", r"\u")
    # decoded_s = contents_json.encode('utf-8').decode('unicode_escape')
    # print(decoded_s)
    try:
        return json.loads(contents_json)
    except Exception as e:
        print('json解码错误',e)


def getFirstText(content):
    i=0
    # print('123',content)
    for item in content:
        if item['type'] == 'text' :
            i+=1
            if i>1:
                # print(item['url'])
                text = item['content'] 
                text = f'{text[:40]}...'
                return text
                break